第 3 章:組態檔中的資源 resource
資源透過 resource 區塊來定義,一個 resource 可以定義一個或多個基礎設施資源對象,例如 VPC、虛擬機,或是 DNS 記錄、Consul 的鍵值對資料等。
資源語法
資源透過 resource 塊定義,我們先來講解透過 resource 塊定義單一資源物件的場景。
resource "aws_instance" "web" {
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
}
- 定義了虛擬機器所使用的鏡像 id 以及虛擬機器的尺寸。
資源參數
不同資源定義了不同的可賦值的屬性,官方文件稱之為參數(Argument),有些參數是必填的,有些參數是可選的。使用某項資源前可以透過閱讀相關文件來了解參數清單以及他們的意義、賦值的限制條件。
資源類型的文檔
每一個 Terraform Provider 都有自己的文檔,用以描述它所支援的資源類型種類,以及每種資源類型所支援的屬性清單。
大部分的公共 Provider 都是透過 Terraform Registry 連帶文件一起發布的。當我們在 Terraform Registry 網站上瀏覽 Provider 的頁面時,我們可以點擊 "Documentation" 連結來瀏覽相關文件。Provider 的文件都是版本化的,我們可以選擇特定版本的 Provider 文件。
Provider 文件曾經是直接託管在 terraform.io,有些 Provider 的文檔目前依然託管在那裡,但目前 Terraform Rregistry 才是所有公共 Provider 文檔的主站(唯一的例外是用來讀取其他 Terraform 狀態資料的內建的 terraform provider,它的文檔目前不在 Terraform Registry 上)。
資源的行為
一個 resource 區塊聲明了作者想要建立的一個確切的基礎設施對象,並且設定了各項屬性的值。如果我們正在編寫一個新的 Terraform 程式碼文件,那麼程式碼所定義的資源僅僅只在程式碼中存在,並沒有與之對應的實際的基礎設施資源存在。
對一組 Terraform 程式碼執行 terraform apply 可以建立、更新或銷毀實際的基礎設施對象,Terraform 會制定並執行變更計劃,以使得實際的基礎設施符合程式碼的定義。
每當 Terraform 依照一個 resource 塊創建了一個新的基礎設施對象,這個實際的對象的 id 會被保存進 Terraform 狀態中,使得將來 Terraform 可以根據變更計劃對它進行更新或是銷毀操作。如果一個 resource 區塊所描述的資源在狀態檔案中已有記錄,那麼 Terraform 會比對記錄的狀態與程式碼描述的狀態,如果有必要, Terraform 會制定變更計畫以使得資源狀態能夠符合程式碼的描述。
這種行為適用於所有資源而無關其類型。創造、更新、銷毀一個資源的細節會根據資源類型而不同,但是這個行為規則卻是普適的。
存取資源輸出屬性
資源不但可以透過參數傳值,成功創建的資源還對外輸出一些透過呼叫 API 才能獲得的唯讀數據,經常包含了一些我們在實際創建一個資源之前無法獲知的數據,比如雲主機的 id 等,官方文檔將之稱為屬性(Attribute)。我們可以在同一模組內的程式碼中引用資源的屬性來建立其他資源或是表達式。在表達式中引用資源屬性的語法是 <RESOURCE TYPE>.<NAME>.<ATTRIBUTE>
。
要取得一個資源類型輸出的屬性列表,我們可以查閱對應的 Provider 文檔,一般在文檔中會專門記錄資源的輸出屬性列表。